/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.bld.model.cliente;

import br.com.bld.util.facade.AbstractBe;
import br.com.bld.util.facade.EntityFactory;
import br.com.bld.util.facade.BLDDataErro;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.HashMap;

/**
 *
 * @author Pedro
 */
public class ClienteBe extends AbstractBe implements BLDDataErro {

    private final ClienteDao dao;

    public ClienteBe() throws SQLException {

        super();

        dao = createDao();
    }

    public ClienteBe(Connection conn) {

        super(conn);
        dao = createDao();
    }

    private ClienteDao createDao() {

        String table = "bldtb01_cliente";

        String[] fields = {
              "id",
              "razao_social", 
              "nome_fantasia",
              "cnpj",
              "inscricao_estadual",
              "bldtb04_id",
              "bldtb06_id", 
              "bldtb08_id"
        };

        String[] pk = {"id"};

        String sequece = "bldtb01_cliente_id_seq";

        return new ClienteDao(conn, new EntityFactory(conn, table, fields, pk, sequece));
    }

    public ClientePK inserir(ClienteEntity entity) throws SQLException {

        if (entity == null) {
            throw new IllegalArgumentException(String.format(PARM_NAO_INFORMADO, ClienteEntity.CLASS_ID));
        }
        if (entity.getNomeFantasia().equals("")) {
            throw new IllegalArgumentException(String.format(CAMPO_OBRIGATORIO, ClienteEntity.CAMPO_NOME));
        }

        ClientePK resposta = new ClientePK(proximoId());

        if (dao.insert(entity, resposta) != 1) {
            resposta = null;
        }

        commit();

        return resposta;
    }

    public ClienteEntity selecionar(ClientePK pk) throws SQLException {

        if (pk == null) {
            throw new IllegalArgumentException(String.format(PARM_NAO_INFORMADO, ClientePK.CLASS_ID));
        }

        return dao.selectByPk(pk);
    }

    public int atualizar(ClienteEntity entity, ClientePK pk) throws SQLException {

        if (entity == null) {
            throw new IllegalArgumentException(String.format(PARM_NAO_INFORMADO, ClienteEntity.CLASS_ID));
        }

        if (selecionar(pk) == null) {
            throw new IllegalArgumentException(REGT_NAO_LOCALIZADO);
        }

        int resposta = dao.update(entity, pk);

        commit();

        return resposta;
    }

    public int apagar(ClientePK pk) throws SQLException {

        if (pk == null) {
            throw new IllegalArgumentException(String.format(PARM_NAO_INFORMADO, ClientePK.CLASS_ID));
        }

        if (selecionar(pk) == null) {
            throw new IllegalArgumentException(REGT_NAO_LOCALIZADO);
        }

        int resposta = dao.delete(pk);

        commit();

        return resposta;
    }

    public HashMap<ClientePK, ClienteEntity> selecionarTodos() throws SQLException {
        return dao.selectAll();
    }

    public HashMap<ClientePK, ClienteEntity> selecionarPaginacao(Integer numrPagina, Integer qtdePorPagina) throws SQLException {

        if (numrPagina == null) {
            throw new IllegalArgumentException(String.format(PARM_NAO_INFORMADO, "Número da Página"));
        }
        if (numrPagina == null) {
            throw new IllegalArgumentException(String.format(PARM_NAO_INFORMADO, "Quantidade por Página"));
        }

        return dao.selectByPage(numrPagina, qtdePorPagina);
    }
    
    public ClienteEntity selecionarPorNomeFantasia(String nomeFantasia) throws SQLException {
        return dao.selectByNomeFantasia(nomeFantasia);
    }
    
    public ClientePK selecionarPKPorNomeFantasia(String nomeFantasia) throws SQLException {
        return dao.selectPkByNomeFantasia(nomeFantasia);
    }
    
    private Long proximoId() throws SQLException {
        return dao.nextSequeceValue();
    }
}
